// 引入 xlsx 库
const XLSX = require('xlsx');


export function downloadTableData(table, dataList, dict) {
    const { header, merges, props } = buildHeader(table)
    // 合并表头和数据
    let sheetData = [...header];

    dataList.forEach(row => {
        let line = []
        props.forEach(prop => {
            let dictValue = getDictValue(prop, row[prop], dict)
            if (dictValue) {
                line.push(dictValue)
                return
            }
            line.push(processStyle(row[prop]))
        })
        sheetData.push(line)
    })

    // 创建工作表
    const ws = XLSX.utils.aoa_to_sheet(sheetData);

    // 设置合并单元格
    ws['!merges'] = merges

    // 创建工作簿
    const wb = XLSX.utils.book_new();
    XLSX.utils.book_append_sheet(wb, ws, 'Sheet1');

    // 导出 Excel 文件
    XLSX.writeFile(wb, '加工过程.xlsx');
}

const ignoreList = ['操作']

//'product_status', 'yes_or_no', 'processing_result'
const dictConfig = {
    status: 'product_status',
    isRework: 'yes_or_no',
    '工序结果': 'processing_result'
}


function processStyle(text) {
    if (text == null || text === '') {
        return ''
    }
    if (typeof text == 'number') {
        return text
    }
    // 创建一个临时的 DOM 元素
    const tempElement = document.createElement('span');
    // 将文本插入到临时元素中
    tempElement.innerHTML = text.trim();
    // 检查是否只有一个子元素且是有效标签
    if (tempElement.childNodes.length === 1 && tempElement.firstChild.nodeType === 1) {
        // 提取标签内容
        return tempElement.firstChild.textContent.trim();
    }
    // 如果不是标签，返回 null 或其他提示
    return text;
}

function getDictValue(prop, value, dict) {
    if (value == undefined) {
        return null
    }
    if (prop.includes("工序结果")) {
        prop = '工序结果'
    }
    let type = dictConfig[prop]
    if (type) {
        let v = dict[type].filter(item => {
            return item.value == value
        })
        return v[0].label
    }
    return null
}

function buildHeader(table) {
    let h1 = [], h2 = [], merges = [], props = []
    let index = 0
    table.$children.forEach((element) => {
        let label = element.label;
        if (!label || ignoreList.includes(label)) {
            return
        }
        if (element.$children.length <= 0) {
            props.push(element.prop)
            h1.push(label)
            h2.push('')
            merges.push({
                s: { r: 0, c: index },
                e: { r: 1, c: index }
            })
            index++
            return
        }
        merges.push({
            s: { r: 0, c: index },
            e: { r: 0, c: index + element.$children.length - 1 }
        })
        element.$children.forEach(element2 => {
            if (!element2.label) {
                return
            }
            h1.push(label)
            index++
            h2.push(element2.label)
            props.push(element2.prop)
        });

    });

    return {
        header: [h1, h2],
        merges,
        props
    }
}